package ee;

import org.junit.Test;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 异常
 * Java面向对象语言,程序中所出现的所有错误,定义为对象[处理对应错误]
 *
 * Throwable顶级异常超类
 *
 * Exception异常:描述程序级别的错误---有解决方案
 *                                  编译期:--RunTimeException异常表示类
 *                                         FileOutputStream创建对象---波浪线---抛出方法之外
 *                                    检查异常:通常都是编译器检查处理,程序直接报错,抛出
 *                                    解决方案:①捕获异常:记录错误--产生异常原因
 *                                    语法:try
 *                                             ②抛出异常---抛出方法之外---打印控制台
 *                                     运行期:控制台直接显示异常对象[异常对象名字,产生原因]
 *                                     非检查异常:控制台输出
 * Error错误:描述系统级别的错误---出现--程序宕机
 *            非常低--->递归问题-->
 */
public class EE {
/**
 * Error 错误----程序问题严重错误
 * 模拟:方法调方法---栈溢出错误
 * StackOverflowError栈溢出错误
 * ---程序宕机---
 * while(true){
 *     拼接字符串对象
 *
 * }
 */
public static void method(){
    method();
}
@Test
    public void testError(){
    EE.method();
}
    /**
     * Exception异常:检查异常[出现编译期]---代码报波浪线
     *              两种处理手段:①捕获异常:记录错误--产生异常原因
     *              语法:try{
     *                  怀疑代码可能有异常或者提示异常
     *              }catch(异常名字 e){
     *                  e.printStack
     *              }catch(中异常名字 e){
     *
     *              }c
     *                         ②抛出异常
     *                  非检查异常[出现运行期]---代码无错误---控制台
     *------------------------------------
     * 异常:FileNotFoundException() 文件不存在异常
     * 产生原因:路径写错
     *
     */
    @Test
    public void testException()throws FileNotFoundException {
        //检查异常[出现编译期]---代码报波浪线
        //FileOutputStream fis=new FileOutputStream("");
        //非检查异常[出现运行期]---控制台
        try {
            String str = "a";
            str.length();
            str.charAt(1);
            Integer.parseInt(str);
        }catch(StringIndexOutOfBoundsException e){
            e.printStackTrace();
            System.out.println("字符串小异常:下标越界异常~~");
        }
        catch(NumberFormatException e){
            e.printStackTrace();
            System.out.println("字符串小异常~~");
        }finally {
        System.out.println("一定执行所有代码块~");
        }

    }
    /**
     * 作业1:写出5个[非检查]异常的代码示例
     * 提示:查API ---java.lang异常
     * 字符串,包装类,集合,IO流
     *
     */
    @Test
    public static void main(String[] args) {
        // 1. 字符串操作异常
        String str = null;
        try {str.length();  // 对空字符串调用 length 方法，会抛出 NullPointerException
        } catch (NullPointerException e) {
            System.out.println("字符串为空，操作引发异常: " + e.getMessage());
        }

        // 2. 包装类异常
        Integer num = null;
        try {
            int value = num.intValue();  // 对空包装类对象调用 intValue 方法，会抛出 NullPointerException
        } catch (NullPointerException e) {
            System.out.println("包装类对象为空，操作引发异常: " + e.getMessage());
        }
        // 3. 集合异常
        List<String> list = new ArrayList<>();
        try {
            String element = list.get(0);  // 对空集合获取元素，会抛出 IndexOutOfBoundsException
        } catch (IndexOutOfBoundsException e) {
            System.out.println("集合为空，获取元素引发异常: " + e.getMessage());
        }

        // 4. I/O 流异常
        try {
            java.io.FileReader reader = new java.io.FileReader("nonexistent.txt");  // 读取不存在的文件，会抛出 FileNotFoundException
        } catch (FileNotFoundException e) {
            System.out.println("文件不存在，读取引发异常: " + e.getMessage());
        }

        // 5. 输入输出异常
        try {
            throw new IOException("自定义的 I/O 异常");  // 主动抛出 IOException
        } catch (IOException e) {
            System.out.println("自定义的 I/O 异常: " + e.getMessage());
        }
    }
}

